package br.com.alinesoftware.app.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;
import org.hibernate.validator.constraints.Email;

import br.com.alinesoftware.app.domain.Sexo;
import br.com.alinesoftware.app.entity.ArquivoImagem;

import com.powerlogic.jcompany.commons.config.stereotypes.SPlcEntity;
import com.powerlogic.jcompany.config.domain.PlcFileAttach;
import com.powerlogic.jcompany.domain.validation.PlcUnifiedValidation;

@SPlcEntity
@Entity
@Table(name = "PESSOA")
@SequenceGenerator(name = "SE_PESSOA", sequenceName = "SE_PESSOA")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TIPO_PESSOA", discriminatorType = DiscriminatorType.STRING, length = 1)
@Access(AccessType.FIELD)
@PlcUnifiedValidation
public class Pessoa implements Serializable {

	private static final long serialVersionUID = 5905648488708844209L;

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE)
	@Column(nullable = false, length = 5)
	private Long id;

	@NotNull
	@Size(max = 255)
	@Column
	private String nome;

	@NotNull
	@Size(max = 255)
	@Column
	@Email
	private String email;

	@Enumerated(EnumType.STRING)
	@NotNull
	@Column(length = 10)
	private Sexo sexo;

	@ManyToOne(targetEntity = TelefoneEntity.class, fetch = FetchType.LAZY)
	@ForeignKey(name = "FK_PESSOA_TELEFONE")
	@NotNull
	@JoinColumn
	private Telefone telefone;

	@ManyToOne(targetEntity = ControleAcessoEntity.class, fetch = FetchType.LAZY)
	@ForeignKey(name = "FK_PESSOA_CONT_ACESS")
	//TODO @NotNull //Descomentar esta linha 
	@JoinColumn
	private ControleAcesso controleAcesso;

	@OneToMany(targetEntity = ContaRedeSocialEntity.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="pessoa")
	@ForeignKey(name = "FK_CONREDESOC_PESSOA")
	private List<ContaRedeSocial> contaRedeSocial;

	@OneToMany(targetEntity = ArquivoImagem.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@OrderBy("id")
	@ForeignKey(name = "FK_IMAGEM_PESSOA_IMAGEM")
	@PlcFileAttach(multiple = true)
	private List<ArquivoImagem> imagem;

	//@NotNull
	@Column(length = 11)
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataNascimento;

	@NotNull
	@Column(length = 11)
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataCadastro;

	public Pessoa() {
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Sexo getSexo() {
		return sexo;
	}

	public void setSexo(Sexo sexo) {
		this.sexo = sexo;
	}

	public Telefone getTelefone() {
		return telefone;
	}

	public void setTelefone(Telefone telefone) {
		this.telefone = telefone;
	}

	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public List<ContaRedeSocial> getContaRedeSocial() {
		return contaRedeSocial;
	}

	public void setContaRedeSocial(List<ContaRedeSocial> contaRedeSocial) {
		this.contaRedeSocial = contaRedeSocial;
	}

	public ControleAcesso getControleAcesso() {
		return controleAcesso;
	}

	public void setControleAcesso(ControleAcesso controleAcesso) {
		this.controleAcesso = controleAcesso;
	}

	public List<ArquivoImagem> getImagem() {
		return imagem;
	}

	public void setImagem(List<ArquivoImagem> imagem) {
		this.imagem = imagem;
	}
}
